package com.qn.mapper;

import com.qn.dto.OrderDTO;
import com.qn.entity.Order;
import com.qn.entity.OrderEntity;
import com.qn.vo.OrderVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

@Mapper(componentModel = "spring")
public interface OrderConverter {

    /**
     * 将源对象中属性值拷贝到目标对象中
     * 属性名称相同时覆盖目标对象中到值
     *
     * @param orderVO
     * @param order
     */
    void mapper(OrderVO orderVO, @MappingTarget Order order);

    /**
     * 属性名称不同时，通过映射关系进行赋值
     * 以下的类型之间是mapstruct自动进行类型转换的:
     * 1、基本类型及其他们对应的包装类型。
     * 此时mapstruct会自动进行拆装箱。不需要人为的处理
     * 2、基本类型的包装类型和string类型之间
     *
     * @param order
     * @Mapping 注解完成属性名称间的映射
     */
    @Mapping(target = "total", source = "number")
    void mapper(OrderDTO orderDTO, @MappingTarget Order order);

    /**
     * 属性映射可以进行日期格式化，仅支持 Date类型转换为String类型的格式化
     * 其他的日期类型转换需要 表达式搭配格式化转换器使用
     *
     * @param order
     */
    @Mapping(source = "createTime", target = "time", dateFormat = "yyyy-MM-dd")
    OrderEntity mapper(Order order);

    /**
     * 使用自定义格式转换器进行属性格式化及格式转换
     * expression 为表达式 需要引用自定义转换器
     * 可以对属性进行自定义处理，较框架自带的格式化更加全面
     * 注： 引用自定义转换器时要写全 包名ß
     *
     * @param orderEntity
     */
    @Mapping(target = "createTime", expression = "java(cn.hutool.core.date.DateUtil.parse(orderEntity.getTime()))")
    Order mapper(OrderEntity orderEntity);
}

